#!/bin/sh
# WARNING: REQUIRES /bin/sh
#
# - must run on /bin/sh on solaris 9
# - must run on /bin/sh on AIX 6.x
# - if you think you are a bash wizard, you probably do not understand
#   this programming language.  do not touch.
# - if you are under 40, get peer review from your elders.
#
# Install a full Opscode Client
#

PROGNAME=`basename $0`
INSTALLER_DIR=/opt/angrychef
CONFIG_DIR=/etc/chef
USAGE="usage: $0 [-v validation_key] ([-o organization] || [-u url])"

error_exit()
{
  echo "${PROGNAME}: ${1:-"Unknown Error"}" 1>&2
  exit 1
}

is_darwin()
{
  uname -v | grep "^Darwin" 2>&1 >/dev/null
}

is_smartos()
{
  uname -v | grep "^joyent" 2>&1 >/dev/null
}

if is_smartos; then
    PREFIX="/opt/local"
elif is_darwin; then
    PREFIX="/usr/local"
    mkdir -p "$PREFIX/bin"
else
    PREFIX="/usr"
fi

validation_key=
organization=
chef_url=

while getopts o:u:v: opt
do
    case "$opt" in
      v)  validation_key="${OPTARG}";;
      o)  organization="${OPTARG}"; chef_url="https://api.opscode.com/organizations/${OPTARG}";;
      u)  chef_url="${OPTARG}";;
      \?)    # unknown flag
          echo >&2 ${USAGE}
    exit 1;;
    esac
done
shift `expr ${OPTIND} - 1`

if [ "" != "$chef_url" ]; then
  mkdir -p ${CONFIG_DIR} || error_exit "Cannot create ${CONFIG_DIR}!"
  (
  cat <<'EOP'
log_level :info
log_location STDOUT
EOP
  ) > ${CONFIG_DIR}/client.rb
  if [ "" != "$chef_url" ]; then
    echo "chef_server_url '${chef_url}'" >> ${CONFIG_DIR}/client.rb
  fi
  if [ "" != "$organization" ]; then
    echo "validation_client_name '${organization}-validator'" >> ${CONFIG_DIR}/client.rb
  fi
  chmod 644 ${CONFIG_DIR}/client.rb
fi

if [ "" != "$validation_key" ]; then
  cp ${validation_key} ${CONFIG_DIR}/validation.pem || error_exit "Cannot copy the validation key!"
  chmod 600 ${CONFIG_DIR}/validation.pem
fi

# rm -f before ln -sf is required for solaris 9
rm -f $PREFIX/bin/chef-client
rm -f $PREFIX/bin/chef-solo
rm -f $PREFIX/bin/chef-apply
rm -f $PREFIX/bin/chef-shell
rm -f $PREFIX/bin/knife
rm -f $PREFIX/bin/ohai

ln -sf $INSTALLER_DIR/bin/chef-solo $PREFIX/bin || error_exit "Cannot link chef-solo to $PREFIX/bin"
if [ -f "$INSTALLER_DIR/bin/chef-apply" ]; then
  ln -sf $INSTALLER_DIR/bin/chef-apply $PREFIX/bin || error_exit "Cannot link chef-apply to $PREFIX/bin"
fi
if [ -f "$INSTALLER_DIR/bin/chef-shell" ]; then
  ln -sf $INSTALLER_DIR/bin/chef-shell $PREFIX/bin || error_exit "Cannot link chef-shell to $PREFIX/bin"
fi
ln -sf $INSTALLER_DIR/bin/knife $PREFIX/bin || error_exit "Cannot link knife to $PREFIX/bin"
ln -sf $INSTALLER_DIR/bin/ohai $PREFIX/bin || error_exit "Cannot link ohai to $PREFIX/bin"

# We test for the presence of /usr/bin/chef-client to know if this script succeeds, so this
# must appear as the last real action in the script
ln -sf $INSTALLER_DIR/bin/chef-client $PREFIX/bin || error_exit "Cannot link chef-client to $PREFIX/bin"

# Ensure all files/directories in $INSTALLER_DIR are owned by root. This
# has been fixed on new installs but upgrades from old installs need to
# be manually fixed.
chown -Rh 0:0 $INSTALLER_DIR

echo "Thank you for installing Chef!"

exit 0
